2024-10-25
VisualStudioにパフォーマンスプロファイラなるものを見つけたので使い方を 確認してみました
学ぶより慣れろということで、取り合えず使い始めてみます
フレームワークのバージョンや種類によって使用できるツールに差異があるようです
触ってみた感想としては、これだけ様々な情報が得られれば、これらのツールで概ねパフォーマンスに関する問題は解決できそうだと感じました
昔は、WinDbgを使ったり、外部ツールで情報収集していましたが、 そういったツールももう必要なく、VisualStudio同梱のパフォーマンスツールで事足りるという印象です
非同期及び待機の使用状況を調べるツール
using System.Net.NetworkInformation;
int failed = 0;
var tasks = new List<Task>();
String[] urls = { "www.adatum.com", "www.cohovineyard.com",
"www.cohowinery.com", "www.northwindtraders.com",
"www.contoso.com" };
foreach (var value in urls)
{
var url = value;
tasks.Add(Task.Run(() => {
var png = new Ping();
try
{
var reply = png.Send(url);
if (!(reply.Status == IPStatus.Success))
{
Interlocked.Increment(ref failed);
throw new TimeoutException("Unable to reach " + url + ".");
}
}
catch (PingException)
{
Interlocked.Increment(ref failed);
throw;
}
}));
}
Task t = Task.WhenAll(tasks);
try
{
t.Wait();
}
catch { }
if (t.Status == TaskStatus.RanToCompletion)
Console.WriteLine("All ping attempts succeeded.");
else if (t.Status == TaskStatus.Faulted)
Console.WriteLine("{0} ping attempts failed", failed);
await Task.Delay(2000);
タスクの数や実行時間が指定期間内で確認できる
また、タスクを実行した関数にジャンプすることもできる
名前 | カウント | 開始時間 (ミリ秒) | 終了時間 (ミリ秒) | 合計時間 (ミリ秒) |
---|---|---|---|---|
+ Task.WhenAll | 1 | 2,129.52 | 3,361.90 | 1,232.38 |
| + Program.Main.AnonymousMethod__0() | 5 | 2,126.81 | 3,361.90 | 589.49(平均) |
|| + [詳細] | 5 | 2,126.81 | 3,361.90 | 589.49(平均) |
||| - 標準分散内に 4 行 | 4 | 2,126.81 | 3,361.90 | 568.69(平均) |
||| - [タスク]Program.Main.AnonymousMethod__0() | 1 | 2,689.20 | 3,361.90 | 672.70 |
+ Program.Main() | 1 | 3,396.67 | 5,407.86 | 2,011.19 |
| + Task.Delay | 1 | 3,383.97 | 5,409.15 | 2,025.18 |
EventCounter API または Meter API を使用して公開されたパフォーマンス カウンターの値を監視できます。
使用しているライブラリによりカウンターが変化します。 パフォーマンス調査の入口で最も使いそうな機能です。
汎用イベント ビューアーには、モジュールの読み込み、スレッドの開始、システムの構成などのイベントの一覧を使用して、アプリのアクティビティが表示されます。
中身はかなりコアな内容が多岐に渡り記録されていました。
今の私には使いこなすのは難しそう。
不具合の手がかりが得られない場合に、イベントビューワから探っていくといった使い方はできるかもしれません。
ログ量が多いので基本的にフィルターして使うものだと思います。
データベース クエリを記録します。 その後、個々のクエリに関する情報を分析して、アプリのパフォーマンスを向上させるための場所を見つけることができます。
スロークエリをログできないようなシンプルなDBの場合には便利だと思います。 ADO.NET または Entity Framework Core を使った場合に測定されます。
開始時刻 (秒) | クエリ | 期間 (ミリ秒) | 影響を受けたレコード | 読み取ったレコード |
---|---|---|---|---|
- 5.817 | INSERT INTO “Blogs” (“Url”)VALUES (@p0)RETURNING “BlogId”; | 49.599 | 1 | 1 |
- 7.059 | SELECT “b”.”BlogId”, “b”.”Url” FROM “Blogs” AS “b” ORDER BY “b”.”BlogId” LIMIT 1 | 3.905 | 0 | 2 |
+ 7.124 | TransactionCommitted | 56.610 | 2 | 2 |
| - 7.131 | UPDATE “Blogs” SET “Url” = @p0 WHERE “BlogId” = @p1 RETURNING 1; | 5.076 | 1 | 1 |
| - 7.141 | INSERT INTO “Posts” (“BlogId”, “Content”, “Title”) VALUES (@p0, @p1, @p2) RETURNING “PostId”; | 4.981 | 1 | 1 |
+ 7.202 | TransactionCommitted | 7.490 | 2 | 2 |
| - 7.203 | DELETE FROM “Posts” WHERE “PostId” = @p0 RETURNING 1; | 1.369 | 1 | 1 |
| - 7.205 | DELETE FROM “Blogs” WHERE “BlogId” = @p0 RETURNING 1; | 0.444 | 1 | 1 |
アプリのメモリ使用量を監視します。
コードは個々のものを使用しました。 https://github.com/dotnet/samples/tree/main/core/diagnostics/DiagnosticScenarios
スナップショットを取ると、マネージドオブジェクトの数やメモリ使用量が確認できます
マネージドオブジェクトの割り当てと解放を追跡します
どのオブジェクトがどれ位割り当てられたか確認できます
どの関数でどのオブジェクトがどれ位割り当てられたか確認できます
どのオブジェクトが何回目のGCでどれ位解放されたか確認できます
関数が呼び出された正確な回数や時間が確認できます
どの関数がどれ位時間が掛かっているか確認できます
関数の呼び出し回数が確認できます
呼び出し履歴も確認できます
フレームグラフも確認できます
ファイルI/Oの読み書き量や回数が確認できます